<?php


//CLASSE SYSTEM RESPOSAVEL POR TODO PROCESSO DE URL AMIGAVEL 
// var $_url // SALVA O PARAMETRO PASSADO NA URL
// var $_explode // SEPARA CADA PARAMETRO POR "/"
// var $_controller // SALVA O PRIMERO PARAMETRO COMO CONTROLLER ex. www.webretail.com/index
// $_controller = index
// var $_action // SALVA O SEGUNDO PARAMENTRO COMO AÇÃO e EXECUTA A FUNÇÃO ex. www.webretail.com/produto/cadastrar
// $_actio = cadastrar() 


    class System{
        private $_url;
        private $_explode;
        public $_controller;
        public $_action;
        public $_params;
        public $_timezone;
//CONSTRUTOR
        
        
        
        public function  __construct(){
            $this->setUrl();
            $this->setExplode();
            $this->setController();
            $this->setAction();
            $this->setParams();
            $this->setParamsII();
        }

        //SETAR O TIMEZONE
        
        public function setTimezone ($timezone){
            $this->_timezone  = date_default_timezone_set($timezone);
        }
//FUNÇÃO PARA VALIDAR E ATRIBUIR OS PARAMETROS PADRAO PASSADO NA URL
        private function setUrl(){
            $_GET['url'] = (isset($_GET['url']) ? $_GET['url'] : 'index/index_action');
  //SE $_GET['url'] tiver em branco então por padrão $_GET['url] = index/index_action          
            
            $this->_url = $_GET['url'] .'/' ;
          
        }
   
  //SEPARA A URL POR "/" NUM ARRAY explode[] ex: controle / action    
        private function setExplode(){
            $this->_explode = explode( '/' , $this->_url );
        }
// ATRIBUI O PRIMEIRO VALOR DO PRIMEIRO INDICE EM _controller 
        
        private function setController(){
            $this->_controller = $this->_explode[0];
        }
//VALIDA E ATRIBUI O SEGUNDO VALOR COMO ACTION _action        
        private function setAction(){
            $ac = (!isset($this->_explode[1]) || $this->_explode[1] == null || $this->_explode[1] == 'index' ? 'index_action' : $this->_explode[1]);
            $this->_action = $ac;
        }

//ADICIONA OS VALORES JÁ VALIDADOS EM 2 ARRAYS e EM SEGUIDA OS COMBINA
// O PRIMEIRO VALOR (IMPAR) vai ser o Index
// O SEGUNDO VALOR (PAR) vai ser o valor do index
// inds[] e value[]        
        private function setParams(){
            unset( $this->_explode[0], $this->_explode[1] );
            //print_r($this->_explode);
            array_pop( $this->_explode );
            
            if ( end( $this->_explode ) == null )
                array_pop( $this->_explode );

            $i = 0;
            if( !empty ($this->_explode) ){
                foreach ( $this->_explode as $val ){
                    if ( $i % 2 == 0 ){   
                        $ind[] = $val; //Exp.. Se _explode[N] for impar então fica com indice
                    }else{
                        $value[] = $val; //Exp.. Se _explode[N] for par então fica com valor
                    }
                    $i++;
                }
            }else{
                $ind = array();  //Se não tiver nada. Array em branco
                $value = array();
            }
           //FAZ A JUNÇÃO DOS ARRAYS 
           //SE A QTD DE IND FOR = A QTD DO VALOR, COMBINA
           //SE NÃO ARRAY EM BRANCO
            
            
           /* 29/10/2012 ------> Antes era count($value) */ 
            if( count($ind) == count(isset($value)) && !empty($ind) && !empty($value) ) 
              ( $this->_params = array_combine($ind, $value));
            
              else
                $this->_params = array();
        }
        
        
        public function getParam( $name = null ){
            if ( $name != null )
                if (array_key_exists ($name, $this->_params))
                        return $this->_params[$name];
                else 
                    return false;
            else
                return $this->_params;
        }
        
        
        /*Pega todos os parametros */
        public function setParamsII(){
           
           $i=0;
           if( !empty ($this->_explode) ){
            foreach ( $this->_explode as $val ){
                    if ( $i % 2 == 0 ){   
                        $ind[] = $val; //Exp.. Se _explode[N] for impar então fica com indice
                    }else{
                        $value[] = $val; //Exp.. Se _explode[N] for par então fica com valor
                    }
                   $i++;
                }
              
           } else{
               
                $ind = array(); 
                $value = array();  
        
        }
        
     // echo count($value).'=? '.count($ind);exit();
    if (!empty($ind)){
       if(!empty($value)){
        if( count($ind) == count($value)){ 
            
            $this->_params = array_combine($ind, $value);
            
        } else{$this->_params = array();}
                
       }else{$this->_params = array();}        
    }else {$this->_params = array();}          
        
 }
        public function getParamII( $name = null ){
          //print_r($this->_params);exit();
            if ( $name != null )
                if (array_key_exists($name, $this->_params))
                        return $this->_params[$name];
                else {
                    $this->
                   $this->erro404($this->_url);
                exit();}
            else
                return $this->_params;
        }
        
      
        //FUNÇÂO QUE CARREGARÁ OS CONTROLLERS E ACTIONS

        public function run(){
            $red = new redirectorHelper();
            $controller_path = CONTROLLERS . $this->_controller . 'Controller.php';
            if( !file_exists( $controller_path ) )
               $red->goToError(); 
                //die('Houve um erro. O controller nao existe.');

            require_once( $controller_path );
            $app = new $this->_controller();

                if( !method_exists($app, $this->_action) )
                    $red->goToError();

            $action = $this->_action;
            $app->init();
            $app->$action();
        }
        
        
        
        
        /*Erro 404*/
       
    }